#include<iostream>


#include"general.h"


#include"camera.h"
#include "hittable.h"
#include "hittable_list.h"
#include "sphere.h"



int main() {


	hittable_list world;

	auto ground_mat = make_shared<lambertian>(color(0.5, 0.5, 0.5));//ground material
	world.add(make_shared<sphere>(point3(0, -1000, 0), 1000, ground_mat));//ground sphere

	for (int i = 0; i < 8; i++) {
		for (int j = 0; j < 8; j++) {
			auto cur_mat = random_double();
			point3 center(i + 0.9 * random_double(), 0.2, j + 0.9 * random_double());//sphere random center

			if ((center - point3(4, 0.2, 0)).length() > 0.9) {
				shared_ptr<material> sph_mat;

				if (cur_mat < 0.8) {
					//diffuse
					auto albedo = color::random() * color::random();
					sph_mat = make_shared<lambertian>(albedo);
					world.add(make_shared<sphere>(center, 0.2, sph_mat));
				}
				else if (cur_mat < 0.95) {
					//metal
					auto albedo = color::random(0.5, 1);
					auto fuzz = random_double(0, 0.5);
					sph_mat = make_shared<metal>(albedo, fuzz);
					world.add(make_shared<sphere>(center, 0.2, sph_mat));
				}
				else {
					//glass
					sph_mat = make_shared<dielectric>(1.5);
					world.add(make_shared<sphere>(center, 0.2, sph_mat));
				}

			}
		}
	}


	auto material1 = make_shared<dielectric>(1.5);
	world.add(make_shared<sphere>(point3(0, 1, 0), 1.0, material1));
	auto material2 = make_shared<lambertian>(color(0.4, 0.2, 0.1));
	world.add(make_shared<sphere>(point3(-4, 1, 0), 1.0, material2));
	auto material3 = make_shared<metal>(color(0.7, 0.6, 0.5), 0.0);
	world.add(make_shared<sphere>(point3(4, 1, 0), 1.0, material3));



	camera cam;

	cam.aspect_ratio = 16.0 / 9.0;
	cam.image_width = 800;
	cam.samples_num = 80;
	cam.max_depth = 50;

	cam.vfov = 20;
	cam.lookfrom = point3(13, 2, 3);
	cam.lookat = point3(0, 0, 0);
	cam.vup = point3(0, 1, 0);

	cam.defocus_angle = 0.6;
	cam.focus_dist = 10;
	
	cam.render(world);


}